package cn.edu.tjpu.lxy.baseDataType;

/**
 * java基本数据类型
 * @author Administrator
 *
 */
public class TestDriver {

	/*
	 * 补充：
	 * 字节：1 byte就是1字节；1字节包含8位0或1，也就是1字节包含8bit；
	 * java8中基本数据类型：
	 * 整型：byte short int long
	 * 浮点：float double
	 * 字符型：char
	 * 布尔：boolean
	 * 
	 * 详解：
	 * byte 大小 1字节（1Byte） 数值范围：-128~127
	 * short 大小 2字节
	 * int  大小 4字节
	 * long 大小 8字节
	 * java的整型数值常量默认类型是int；
	 * 
	 * float 大小 4字节
	 * double 大小 8字节
	 * 浮点数常量默认类型是double类型；
	 * 
	 * char 大小 2字节
	 * 
	 * boolean 1字节
	 * 注意：
	 * java中常量数值默认是 int 和 double类型。
	 * 在java的基本类型中：存在强制转换和默认转换两种转换方式。
	 * 强制转换：从高类型向低类型进行转换，可能会造成精度丢失；
	 *          强制类型转换需要使用 ()显式写出。格式 “ (目标类型)被转换类型”；
	 * 默认转换：从低类型向高类型进行转换，不会产生精度丢失；
	 *          如果在一个运算表达式中，存在多种类型，则该表达式最终的计算结果的类型为表达式中的最高类型；
	 *          默认类型转换不需要显式写出，默认进行转换；
	 *          
	 *          注意：默认转换顺序： 整型向浮点型转换；整型->浮点型；
	 *                             在整型内部，按照 byte->char->short->int->long顺序进行默认转换；
	 *          
	 *          默认类型转换还存在于 java的基本类型向String类型的转换；
	 */
	
	
	public static void main(String[] args) {
		
		// 调用子方法
		test01();
		System.out.println("---------------------");
		// 调用子方法
		test02();
		System.out.println("-----------------------");
		test04();
	}

	/**
	 * 基本数据类型举例
	 */
	private static void test01() {
		// byte 类型：
		// 出现错误原因：200超出了byte的表示范围
		/*
		 * 因为java的数值常量默认类型是int类型；
		 * 当数值常量表示的范围超出了类型的范围，
		 * 需要进行强制转换，否则会出现类型不匹配错误。 
		 * 如果进行强制类型转换，可能会引起数值(精度)丢失；
		 * 
		 * 因为java数值常量默认是int；
		 * 当需要使用比int类型还要大的数值是可以采用 “数值+类型后缀”的方式进行表示
		 * long类型的后缀是 L 或 l；
		 * 例如：long nPara4 = 500000000000000000L;
		 * 因为java中浮点类型的数值常量默认类型是double类型；
		 * 如果浮点数作为 float类型使用，则需要采用 “数值+类型后缀”的方式进行表示；
		 * 
		 * float类型的后缀是 F 或 f；
		 * 
		 */
		byte bPara1 = (byte) 200; 
		System.out.println("bPara1 is:"+bPara1);
		short nPara2 = 3000;
		int nPara3 = 4;
		long nPara4 = 500000000000000000L;

		// 表达式中默认类型转换以及强制类型转换
		int iResult = (int) (nPara3 + nPara2 + nPara4);
		
		double dPara5 = 2.2;
		float fPara6 = 2.2F;
		
		long iResult2 = nPara3 + nPara2 + nPara4 + 2;
		
		//long iResult3 = nPara3 + nPara2 + nPara4 + 2.0; // 存在类型强制转换编译错误
		
		double iResult4 = nPara3 + nPara2 + nPara4 + 2.0;
	}
	
	/**
	 * char类型
	 */
	private static void test02(){
		/*
		 *  char类型是字符类型 ，表示一个单一的字符,char类型的值表示该字符的ascii码值
		 *  char类型需要使用 '' 进行引出；一个char类型只能指向一个字符；
		 *  char类型可以向 short 、 int类型进行默认转换,转换时使用的值就是字符的ascii码值；
		 *  转义字符
		 *  转义字符一般使用 “\” 进行转义处理，“\”只是一个标识作用，编译过程中，编译器会将其忽略；
		 *  – ‘\n’ ‘\r’ ‘\t’ ‘\\’ ‘\’’ ‘\“’
		 */
		
		char chPara1 = 'a';
		
		System.out.println("chPara1 is :" + chPara1);

		System.out.println("chPara1 is :" + (chPara1 + 0));
		
		// 转义字符
		
		String str0 = "dfas\"f\"ss";
		System.out.println("转义字符："+str0);
	}
	
	/**
	 * 基本类型和string类型的转换
	 */
	private static void test03(){
		char chPara1 = 'a';		
		String str1 = "chPara1 is :" + chPara1;
		// 在表达式 chPara1 + "" 最高类型是 String类型，这里完成了 char类型向string默认类型转换处理
		String str2 = chPara1 + "";
	}
	
	/**
	 * 浮点数精度丢失问题
	 * 浮点数相等判定问题：根据精度进行判定
	 * 例如：业务规定数据值精确度是 0.01 
	 * 则，数值 1.0972 和数值 1.0931 相等
	 */
	private static void test04(){
		double dPara1 = 2.0;
		double dPara2 = 1.1;
		double dPara3 = dPara1-dPara2;
		System.out.println("计算结果为："+dPara3);
	}
}
